package com.naiterui.ehp.bs.b2c.inventory.service;

import com.naiterui.ehp.bp.support.exception.BusinessException;
import com.naiterui.ehp.bs.b2c.common.bo.inventory.PlatformStockBO;
import java.util.List;
import java.util.Set;

import com.naiterui.ehp.bs.b2c.common.bo.inventory.StockBO;
import com.naiterui.ehp.bs.b2c.common.bo.inventory.StockQuantityBO;
import com.naiterui.ehp.bs.b2c.inventory.exception.StockServiceException;
import com.naiterui.ehp.bs.b2c.pharmacy.bo.WarehouseGoodsInventoryBO;

/**
 * <pre>
 *      库存接口
 * </pre>
 *
 * @author 王泽浩
 * @date 2019-05-13 20:19
 * @since 1.0.0
 */
public interface IStockService {

    void remove(Long warehouseId, Set<Long> skuIds) throws StockServiceException;

    /**
     * 获取指定商品的剩余库存
     */
    StockBO getStock(Long skuId);

    /**
     * 批量获取商品的库存
     */
    List<StockBO> getStocks(Set<Long> skuIds);

    /**
     * 修改库存状态
     */
    void updateStatus(Long warehouseId, Integer status, String operator);

    /**
     * 用户下单分配库存，扣减欲占库存
     * <p>
     * 1、筛选满足订单中全部商品的合作药店列表。
     * 2、筛选可用库存满足的药店列表。
     * 3、按照系统排序选择最先添加的药店列表。
     * 4、将药店（库房）分配至订单。并进行库存预占。
     * 5、如果订单被某个药店拒绝，那么放到最后
     */
    Long preAssignWarehouse(Long orderId, String orderSn, List<StockQuantityBO> pqs) throws StockServiceException;

    boolean checkWarehouseSku(Long warehouseId, List<StockQuantityBO> pqs);

    /**
     * 订单审核完成后，进行库房分配
     * <p>
     * 1、订单是否已经有指定库房，如果有指定药店，则直接判断库存是否满足，满足则进行库存预占清理（根据订单号清理相关的全部预占记录），并将库存占用。如不满足则分仓失败。
     * 2、库房无指定库房（订单拒绝且未人工指定库房），则按照预分配逻辑进行订单分配并进行库存占用。
     */
    void assignWarehouse(Long orderId, String orderSn, Long warehouseId, List<StockQuantityBO> pqs) throws StockServiceException;

    /**
     * 仓库拒绝
     */
    void warehouseReject(Long orderId, String orderSn, Long warehouseId, List<StockQuantityBO> pqs);

    /**
     * 修改仓库
     */
    void modifyWarehouse(Long orderId, String orderSn, Long warehouseId, Long modifyWarehouseId,
                         List<StockQuantityBO> pqs) throws StockServiceException;

    /**
     * 清空欲占/占用
     *
     * @param type 0:清空欲占， 1：清空占用
     */
    void cancel(Long orderId, String orderSn, Long warehouseId, int type, List<StockQuantityBO> pqs);

    /**
     * 反审操作库存，欲占/占用
     *
     * @param type 0:减少预占， 1：减少占用
     */
    void returnAudit(Long orderId, String orderSn, Long warehouseId, int type, List<StockQuantityBO> pqs, String operator);

    /**
     * 订单发货
     */
    void deliveryOrder(Long orderId, String orderSn, Long warehouseId, List<StockQuantityBO> pqs) throws StockServiceException;

    /**
     * 修改库存
     */
    void updateInventory(Long warehouseId, Set<WarehouseGoodsInventoryBO> warehouseGoodsInventorys, String operator) throws StockServiceException;

    /**
     * 获取处方流转平台商品库存
     * @param numbers
     * @return
     * @throws BusinessException
     */
    List<PlatformStockBO> getPlatformStocks(Set<String> numbers);
}
